interface _CA_ {
    /**
     * 排除数组中的某些值
     * @param arr 从该数组中排除某些值
     * @param exclude 排除掉的值
     * @param deepClone <false> true: 修改深度克隆的新数组; false: 修改浅克隆的新数组; null: 直接修改原数组;
     * @param equalConfig <undefined> 匹配配置项 @see _CU_.isEqual
     * @returns 数组
     */
    exclude<T>(arr: Array<T>, exclude: Array<T>, deepClone?: null | boolean, equalConfig?: { converter?: Tstring_converters, sames?: Array<string> }): Array<T>;
}
{
    const fn = U.F.overloading('Array-exclude',
        {
            types: [Etype.array, Etype.array, U.F.argType.optional(Etype.undefined)],
            fn: function (arr: any, exclude: any, deepClone: any) {
                return fn(arr, exclude, false);
            }
        },
        {
            types: [Etype.array, Etype.array, Etype.boolean],
            fn: function (arr: any, exclude: any, deepClone: any) {
                return fn(deepClone ? U.clone(arr) : [...arr], exclude, null);
            }
        },
        {
            types: [Etype.array, Etype.array, Etype.null],
            fn: function (arr: any, exclude: any, deepClone: any) {
                exclude.forEach((v: any) => {
                    const i = arr.indexOf(v);
                    if (i >= 0) { arr.splice(i, 1); }
                });
                return arr;
            }
        },
        {
            types: [Etype.array, Etype.array, Etype.undefined, [Etype.obj, Etype.undefined]],
            fn: function (arr: any, exclude: any, deepClone: any, equalConfig: any) {
                return fn(arr, exclude, false, equalConfig);
            }
        },
        {
            types: [Etype.array, Etype.array, Etype.boolean, [Etype.obj, Etype.undefined]],
            fn: function (arr: any, exclude: any, deepClone: any, equalConfig: any) {
                return fn(deepClone ? U.clone(arr) : [...arr], exclude, null, equalConfig);
            }
        },
        {
            types: [Etype.array, Etype.array, Etype.null, Etype.undefined],
            fn: function (arr: any, exclude: any, deepClone: any, equalConfig: any) {
                return fn(arr, exclude, deepClone, {});
            }
        },
        {
            types: [Etype.array, Etype.array, Etype.null, Etype.obj],
            fn: function (arr: any, exclude: any, deepClone: any, equalConfig: any) {
                exclude.forEach((v: any) => {
                    arr.forEach((va: any, i: number) => {
                        if (U.isEqual(v, va, equalConfig.converter, equalConfig.sames)) { arr.splice(i, 1); }
                    });
                });
                return arr;
            }
        },
    );
    Object.defineProperty(_CA_.prototype, 'exclude', {
        writable: false,
        configurable: false,
        enumerable: false,
        value: fn
    });
}
